package org.abc.fund.entity.strategy;

import jakarta.persistence.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

/**
 * 组合策略实体类
 *
 * <p>用于定义和管理投资组合的策略信息. 每个策略都有唯一的标识符、名称、类型和状态. 此外，策略还包括风险等级, 调仓规则和业绩比较基准等详细信息
 */
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CombinationStrategy {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  /** 策略名称 */
  @Column(nullable = false, unique = true)
  private String name;

  /** 策略类型 */
  @Column(nullable = false)
  private Type type;

  /** 策略描述 */
  private String description;

  /** 适用人群描述 */
  private String targetAudience;

  /** 策略状态 */
  @Enumerated(EnumType.STRING)
  private Status status = Status.DRAFT;

  /** 拒绝理由 */
  private String rejectionReason;

  /**
   * 风险等级, 这一部分照白皮书是和KYC相关, 但我不知道该如何设计, 所以先用String.
   *
   * <p>R1, R2, R3, ... 风险递增
   */
  @Column(nullable = false)
  private String riskLevel;

  /** 调仓规则 */
  @Embedded
  @AttributeOverrides({
    @AttributeOverride(name = "type", column = @Column(name = "rebalance_rule_type"))
  })
  private RebalanceRule rebalanceRule;

  /** 业绩比较基准, 如'沪深300' */
  private String benchmark;

  /** 组成 */
  @ElementCollection
  @CollectionTable(name = "strategy_component", joinColumns = @JoinColumn(name = "strategy_id"))
  private List<StrategyComponent> components = new ArrayList<>();

  @CreationTimestamp
  @Column(updatable = false)
  private LocalDate createdAt;

  @UpdateTimestamp private LocalDate updatedAt;

  public enum Type {
    ASSET_ALLOCATION, // 大类资产配置
    FOF, // FOF组合
    INDEX, // 指数组合
    TIMING // 择时组合
  }

  public enum Status {
    DRAFT, // 草稿
    UNDER_REVIEW, // 审核中
    REJECTED, // 审核未通过
    ACTIVE, // 已上架/生效
    INACTIVE // 已下架/失效
  }
}
